home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume2 / intuitin / jask.1 < prev    next >
Text File  |  1988-12-28  |  35KB  |  956 lines

  1. Path: xanth!nic.MR.NET!hal!cwjcc!mailrus!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v02i101:  jask - intuitive ask replacement
  5. Message-ID: <10931@swan.ulowell.edu>
  6. Date: 28 Dec 88 18:10:07 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 945
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: barsh@stsci.edu (John Barshinger)
  12. Posting-number: Volume 2, Issue 101
  13. Archive-name: intuition/jask.1
  14.  
  15. JASK is a replacement for the WB1.3 ASK command that allows the
  16. user to click on a gadget rather than type at the keyboard.
  17.  
  18. [uuencoded executable included.  ..Bob]
  19.  
  20. #    This is a shell archive.
  21. #    Remove everything above and including the cut line.
  22. #    Then run the rest of the file through sh.
  23. #----cut here-----cut here-----cut here-----cut here----#
  24. #!/bin/sh
  25. # shar:    Shell Archiver
  26. #    Run the following text with /bin/sh to create:
  27. #    jask.c
  28. #    read.me
  29. #    jask.doc
  30. #    test_jask
  31. #    jask.uu
  32. # This archive created: Wed Dec 28 13:04:01 1988
  33. cat << \SHAR_EOF > jask.c
  34. /* Copyright 1988 by I2(EYE) Systems.        JASK.C - Version 1.0
  35. *
  36. *      This file contains all of the routines for this program.
  37. *
  38. *
  39. *          JASK - Drop-in Intuitive Ask Replacement
  40. *
  41. *  This software may be freely distributed provided that this notice
  42. *  is retained.  It may be hacked or used as is in any product as long
  43. *  as you credit me for it.
  44. *
  45. *  If you find this program useful for enhancing your script file
  46. *  capabilites or as example source code, please send $5.00 to:
  47. *
  48. *            I2(EYE) Systems
  49. *            6620 Hunter Road
  50. *            Elkridge, MD 21227
  51. *            Attn: J. Barshinger
  52. *
  53. *    USENET or ARPANET: barsh@stsci
  54. *
  55. *    Note: if you send $10.00,  I'll send you the latest enhancements.
  56. *          Planned enhancements include a re-entrant version so
  57. *          that it can be made resident and a mouse-move capability
  58. *          that will automatically move the pointer to the default
  59. *          gadget.
  60. *
  61. *        JASK - Intuitive Ask Replacement
  62. *        --------------------------------
  63. *            
  64. *  JASK is a replacement for the ASK command distributed in the Amiga 1.3
  65. *  enhancer package. It will allow the user to click on a gadget to specify
  66. *  a positive or negative response rather than type it in at the keyboard.
  67. *  You can move the "requester" to the bottom of the screen or to the front
  68. *  or back of other screens if you don't want to answer it at the moment.
  69. *
  70. *            JASK Parameters
  71. *            ---------------
  72. *                
  73. *    -r  This parameter specifies the "requester" text.  This is
  74. *        the question you want to ask.
  75. *         
  76. *        This is the only REQUIRED parameter. (40 character max.)
  77. *
  78. *        EXAMPLE: "-rYour MOMMA is ?" = Your MOMMA is ? in the
  79. *                                       requester box.
  80. *        (put quotes around the string to put spaces in the text)
  81. *    
  82. *    -p  This specifies the text for the positive (left) gadget.
  83. *        When this gadget is selected, WARN (5) will be returned.
  84. *        (put quotes around the string to put spaces in the text)
  85. *        DEFAULT: YES    (12 character max.)
  86. *        EXAMPLE: -pUGLY = UGLY in the left gadget.
  87. *
  88. *    -n  This specifies the text for the negative (right) gadget.
  89. *        When this gadget is selected, 0 will be returned (success).
  90. *        (put quotes around the string to put spaces in the text)
  91. *        DEFAULT: NO        (12 character max.)
  92. *        EXAMPLE: -nPHAT = PHAT in the right gadget.
  93. *
  94. *    -t  This will specify a timeout period in seconds.  When the
  95. *        timeout period expires, the default answer will be returned.
  96. *        DEFAULT: wait forever
  97. *        EXAMPLE: -t10 = wait 10 seconds.
  98. *        
  99. *    -d  This parameter specifies which gadget is the default (safe)
  100. *        answer.  It does two things:
  101. *        a) determines if the positive or negative answer is 
  102. *           to be default.
  103. *        b) makes a more extravagant border for the specified
  104. *           gadget.
  105. *        n specifies the negative answer, p specifies the positive
  106. *        answer.
  107. *        DEFAULT: if this is not specified, both gadgets will look
  108. *                 the same, but the negative gadget will be returned.
  109. *        EXAMPLE: -dp = Fancy gadget rendered on positive and positive
  110. *                       is the default answer.
  111. *
  112. *    -q  This specifies whether you want the "requester" quick or if
  113. *        you want the "requester" to scroll up.
  114. *        DEFAULT: the "requester" scrolls up to it final position.
  115. *        EXAMPLE: -q = turn off the scrolling effects.
  116. *
  117. */
  118.  
  119. #include "exec/types.h"
  120. #include "intuition/intuition.h"
  121.  
  122. /* define ScreenFont1 to be the default Amiga font in Italic Mode     */
  123.  
  124. struct TextAttr ScreenFont1 = { "topaz.font", TOPAZ_EIGHTY, 
  125.                 FSF_ITALIC, FPF_ROMFONT };
  126.                 
  127. /* define ScreenFont2 to be the default Amiga font            */
  128.  
  129. struct TextAttr ScreenFont2 = { "topaz.font", TOPAZ_EIGHTY, 
  130.                 FS_NORMAL, FPF_ROMFONT };
  131.  
  132. #define POS_GAD TRUE        /* User value for the positive gadget    */
  133. #define NEG_GAD FALSE        /* User value for the negative gadget    */
  134.  
  135. /* Initialize the requester, positive gadget, and negative gadget text    */
  136.  
  137. char RText[] = "                                        ";
  138. char PText[] = "            ";
  139. char NText[] = "            ";
  140.  
  141. struct IntuiText ReqText = { /* Structure defining the Requester Text    */
  142.     3, 2,        /* front pen, back pen colors            */
  143.     JAM2,        /* front pen used for text, back for background */
  144.     0, 0,        /* LeftEdge, TopEdge offsets            */
  145.     &ScreenFont1,    /* Text font to use                */
  146.     RText,        /* Text to print                */
  147.     NULL };        /* Pointer to next Text structure        */
  148.  
  149. struct IntuiText ReqText1 = { /* Structure defining the PosGad Text    */
  150.     1, 2,        /* front pen, back pen colors            */
  151.     JAM1,        /* front pen used for text, back for background */
  152.     2, 5,        /* LeftEdge, TopEdge offsets            */
  153.     &ScreenFont2,    /* Text font to use                */
  154.     PText,        /* Text to print                */
  155.     NULL };        /* Pointer to next Text structure        */
  156.  
  157. struct IntuiText ReqText2 = { /* Structure defining the NegGad Text    */
  158.     1, 2,        /* front pen, back pen colors            */
  159.     JAM1,        /* front pen used for text, back for background */
  160.     2, 5,        /* LeftEdge, TopEdge offsets            */
  161.     &ScreenFont2,    /* Text font to use                */
  162.     NText,        /* Text to print                */
  163.     NULL };        /* Pointer to next Text structure        */
  164.  
  165. /* this data represents points offset from the actual gadget 
  166. (xy coordinates).  This puts the pen down at the first point and
  167. draws to the next point until done.  This is used to draw the boxes
  168. around the Gadgets                            */
  169.  
  170. short DefGadBorderPts[] = { 
  171.     -1, -6,        /* Starting point                */
  172.     -7, -1,        /* points to draw lines to...            */
  173.     -7, 20,
  174.     -1, 25,        /* This data defines the fancy gadget border     */
  175.     100, 25,    /* that you turn on with the -d parameter    */
  176.     106, 20,
  177.     106, -1,
  178.     100, -6,
  179.     -1, -6,
  180.     -1, 25,
  181.     -1, 20,
  182.     100, 20,
  183.     100, 25,
  184.     100, -6,
  185.     100, -1,
  186.     -1, -1 };
  187.     
  188. /* This data defines the inside box around the plain gadget border    */
  189.  
  190. short aGadBorderPts[] = {
  191.     -1, -1,        /* Starting point                */
  192.     100, -1,    /* points to draw the line to...        */
  193.     100, 20,
  194.     -1, 20,
  195.     -1, -1 };    /* interior gadget box outline             */
  196.  
  197. /* This data defines the outside boc around the plain gadget border    */
  198.  
  199. short bGadBorderPts[] = {
  200.     -4, -3,        /* Starting point                */
  201.     103, -3,    /* points to draw the line to...        */
  202.     103, 22,
  203.     -4, 22,
  204.     -4, -3 };    /* exterior gadget box outline             */
  205.  
  206. /* This structure points to the data defining the outside gadget border */
  207.  
  208. struct Border NormGadBorder = {
  209.     0, 0,        /* LeftEdge, TopEdge offsets from the gadget    */
  210.     2, 3, JAM1,    /* FrontPen, BackPen, Draw using the frontpen    */
  211.     5,        /* Number of xy coordinates in this border    */
  212.     bGadBorderPts,    /* pointer to the border xy coordinates        */
  213.     NULL };        /* pointer to the next border to draw        */
  214.  
  215. /* This structure defines the positive gadget border(s)            */
  216.  
  217. struct Border GadBorder1 = {
  218.     0, 0,        /* LeftEdge, TopEdge offsets from the gadget    */
  219.     2, 3, JAM1,    /* FrontPen, BackPen, Draw using the frontpen    */
  220.     5,        /* Number of xy coordinates in this border    */
  221.     aGadBorderPts,    /* pointer to the border xy coordinates        */
  222.     &NormGadBorder };/* pointer to the outside gadget border    */
  223.  
  224. /* This structure defines the negative gadget border(s)            */
  225.  
  226. struct Border GadBorder2 = {
  227.     0, 0,        /* LeftEdge, TopEdge offsets from the gadget    */
  228.     2, 3, JAM1,    /* FrontPen, BackPen, Draw using the frontpen    */
  229.     5,        /* Number of xy coordinates in this border    */
  230.     aGadBorderPts,    /* pointer to the border xy coordinates        */
  231.     &NormGadBorder };/* pointer to the outside gadget border    */
  232.  
  233. /* Structure defining the Negative Gadget                */
  234.  
  235. struct Gadget ReqGad2 = {
  236.     NULL,        /* pointer to next gadget            */
  237.     500, 10,     /* LeftEdge, TopEdge offsets within window     */
  238.     100, 20,    /* Width, Height of the gadget            */
  239.     GADGHCOMP,    /* Complement the gadget color when pressed    */
  240.     RELVERIFY,    /* Pointer must be in gadget when released    */
  241.     BOOLGADGET,    /* This is a boolean gadget            */
  242.     (APTR)(&GadBorder2), /* pointer to the gadget's borders        */
  243.     NULL,        /* pointer to image when gadget is selected    */
  244.     &ReqText2,    /* pointer to gadget's text            */
  245.     NULL, NULL,    /* Mutual exclude, special info flags        */
  246.     NEG_GAD,    /* User data defining gadget id            */
  247.     NULL };        /* Pointer to user data                */
  248.  
  249. /* Structure defining the Positive Gadget                */
  250.  
  251. struct Gadget ReqGad1 = {
  252.     &ReqGad2,    /* pointer to next gadget            */
  253.     40, 10,     /* LeftEdge, TopEdge offsets within window     */
  254.     100, 20,    /* Width, Height of the gadget            */
  255.     GADGHCOMP,    /* Complement the gadget color when pressed    */
  256.     RELVERIFY,    /* Pointer must be in gadget when released    */
  257.     BOOLGADGET,    /* This is a boolean gadget            */
  258.     (APTR)(&GadBorder1), /* pointer to the gadget's borders        */
  259.     NULL,        /* pointer to image when gadget is selected    */
  260.     &ReqText1,    /* pointer to gadget's text            */
  261.     NULL, NULL,    /* Mutual exclude, special info flags        */
  262.     POS_GAD,    /* User data defining gadget id            */
  263.     NULL };        /* Pointer to user data                */
  264.  
  265. /* Structure defining the Screen                    */
  266.  
  267. struct NewScreen ReqScreen = {
  268.     0, 210,          /* LeftEdge, TopEdge                 */
  269.     640, 53,     /* Width, Height                 */
  270.     2,        /* Depth - number of bit-planes            */
  271.     2, 3,          /* DetailPen, BlockPen                 */
  272.     HIRES,          /* ViewModes - 640X200                */
  273.     CUSTOMSCREEN,      /* Screen Type                     */
  274.     &ScreenFont2,     /* Default Font                    */
  275.     "JRBII's Ask Requester V1.0", /* Default Title              */
  276.     NULL,         /* Gadgets, currently ignored             */
  277.     NULL };        /* Custom Bit Map                */
  278.  
  279. /* Structure defining the Window                    */
  280.  
  281. struct NewWindow ReqWindow = {
  282.     0, 10,         /* LeftEdge, TopEdge offset within screen    */
  283.     640, 43,    /* Width, Height                 */ 
  284.     -1, -1,       /* DetailPen, BlockPen, -1 means same as screen */
  285.     GADGETUP,    /* IDCMP Flags, send message on Gadget selected */
  286.     ACTIVATE,     /* Window Flags - Activate the window          */
  287.     &ReqGad1,    /* Pointer to FirstGadget in window        */
  288.     NULL,        /* CheckMark                       */
  289.     NULL,         /* Window title                 */
  290.     NULL,        /* Pointer to Screen                 */
  291.     NULL,        /* Pointer to BitMap                 */
  292.     0, 0,        /* Minimum width, Minimum height         */
  293.     0, 0,        /* Maximum width, Maximum height         */
  294.     CUSTOMSCREEN }; /* Screen Type for this Window             */
  295.  
  296.     struct Window *ReqWin = NULL; /* pointer to a Window structure  */
  297.     struct Screen *ReqScr = NULL; /* pointer to a Screen structure  */
  298.  
  299.     struct Window *OpenWindow();  /* define the OpenWindow routine    */
  300.     struct Screen *OpenScreen();  /* define the OpenScreen routine    */
  301.  
  302.     LONG IntuitionBase = NULL;    /* Address of Intuition library    */
  303.                       /* IT MUST BE A GLOBAL SYMBOL    */
  304.  
  305.     LONG result;          /* result returned to the script file    */
  306.     int timeout;          /* number of seconds before timeout    */
  307.     struct IntuiMessage *msg; /* Message pointer for msg received    */
  308.                   /* from the IDCMP.            */
  309.  
  310.  
  311. /* This routine cleans up and returns "result" to AmigaDos.  It is    */
  312. /* called for normal termination of the program, in addition to any    */
  313. /* error conditions encountered.                    */
  314.  
  315. void Done()
  316. {
  317.  
  318.     /* if there is a message leftover, return it to Intuition    */
  319.  
  320.     if (msg != 0) ReplyMsg(msg);
  321.  
  322.     /* if the Window exists, close it                */
  323.  
  324.     if (ReqWin != NULL) CloseWindow(ReqWin);
  325.  
  326.     /* if the Screen is open, close it                */
  327.  
  328.     if (ReqScr != NULL) CloseScreen(ReqScr);
  329.  
  330.     /* if the Intuition library is open, close it            */
  331.  
  332.     if (IntuitionBase != NULL) CloseLibrary(IntuitionBase);
  333.  
  334.     /* return result to AmigaDos                    */
  335.  
  336.     exit(result);
  337.  
  338. } /* end Done() */
  339.  
  340.  
  341. /* This routine parses the command line parameters and sets up the    */
  342. /* requested special effects                        */
  343. /* Parsing and error checking has been kept to a minimum here to    */
  344. /* keep the executable code size as small as possible            */
  345.  
  346. void Parse_Args(argc, argv)
  347. int argc;    /* count of parameters passed                */
  348. char *argv[];    /* pointer to the parameters                */
  349. {
  350.     char i, k, x, y, error, rfound, pfound, nfound, *arg;
  351.     
  352.     error = 0;    /* error counter                */
  353.     rfound = FALSE; /* -r parameter found?, it's a required parm    */
  354.     pfound = FALSE; /* -p parameter found?                */
  355.     nfound = FALSE; /* -n parameter found?                */
  356.     
  357.     for (i=1; i<argc; i++) /* go through all the parameters        */
  358.     {
  359.         arg = argv[i]; /* get pointer to the current parameter    */
  360.         
  361.         if (arg[0] != '-') error++; /* make sure there's a dash */
  362.         
  363.         /* determine which parameter this is            */
  364.  
  365.         switch (tolower(arg[1])) /* convert the char to lower    */
  366.         {
  367.  
  368.         case 'q':        /* quick parameter        */
  369.             ReqScreen.TopEdge = 146; /* put the screen in    */
  370.                          /* its final location    */
  371.             break;
  372.  
  373.         case 'r':        /* requester text parmeter    */
  374.             if (!rfound)
  375.             {
  376.               rfound = TRUE;  /* set -r parm found flag    */
  377.  
  378.               /* if parm text is greater than its max size     */
  379.               /* truncate it to max size, save the size in k*/
  380.               if ((k = strlen(&arg[2])) > 40)
  381.                 k = 40;
  382.  
  383.               /* calculate the number of spaces needed to    */
  384.               /* center the text in the requester        */
  385.               x = (40 - k) / 2;
  386.             
  387.               /* copy the text into the requester text array */
  388.               for (y = 2; y < k+2; x++, y++)
  389.                 RText[x] = arg[y];
  390.             };
  391.             
  392.             break;
  393.             
  394.         case 'p':        /* Positive Gadget text parm    */
  395.             if (!pfound)
  396.             {
  397.               pfound = TRUE;  /* set -p parm found flag    */
  398.  
  399.               /* if input text is greater than its max size */
  400.               /* truncate it to max size, save the size in k*/
  401.               if ((k = strlen(&arg[2])) > 12)
  402.                 k = 12;
  403.  
  404.               /* calculate the number of spaces needed to    */
  405.               /* center the text in the Gadget        */
  406.               x = (12 - k) / 2;
  407.             
  408.               /* copy the text into the PosGad text array    */
  409.               for (y = 2; y < k+2; x++, y++)
  410.                 PText[x] = arg[y];
  411.             };
  412.             
  413.             break;
  414.  
  415.         case 'n':        /* Negative Gadget text parm    */
  416.             if (!nfound)
  417.             {
  418.               nfound = TRUE;  /* set -n parm found flag    */
  419.  
  420.               /* if input text is greater than its max size     */
  421.               /* truncate it to max size, save the size in k    */
  422.               if ((k = strlen(&arg[2])) > 12)
  423.                 k = 12;
  424.  
  425.               /* calculate the number of spaces needed to    */
  426.               /* center the text in the Gadget        */
  427.               x = (12 - k) / 2;
  428.             
  429.               /* copy the text into the NegGad text array    */
  430.               for (y = 2; y < k+2; x++, y++)
  431.                 NText[x] = arg[y];
  432.             };
  433.  
  434.             break;
  435.  
  436.         case 't':        /* Timeout parameter        */
  437.  
  438.             /* convert the string to an integer value    */
  439.             stcd_i(&arg[2],&timeout);
  440.  
  441.             timeout *= 10; /* our clock ticks 10 times per     */
  442.                        /* second, so multiply the    */
  443.                        /* timeout by 10 to get seconds    */
  444.  
  445.             /* Cause the IDCMP to get a timer message    */
  446.             /* 10 times per second in addition to receiving */
  447.             /* gadget selection messages            */
  448.             ReqWindow.IDCMPFlags = GADGETUP|INTUITICKS;
  449.             break;
  450.  
  451.         case 'd':        /* Default specifier parm    */
  452.             if (tolower(arg[2]) == 'n')
  453.             { /* Negative Gadget Specified             */
  454.                 /* Setup the gadget border to use the    */
  455.                 /* fancy border                */
  456.                 GadBorder2.Count = 16; /* 16 xy points    */
  457.                 GadBorder2.XY = DefGadBorderPts; 
  458.                 GadBorder2.NextBorder = NULL;
  459.                 result = 0; /* default result is Neg    */
  460.             }
  461.             else if (tolower(arg[2]) == 'p') 
  462.             { /* Pos Gadget specified             */
  463.                 /* Setup the gadget border to use the     */
  464.                 /* fancy border                */
  465.                 GadBorder1.Count = 16; /* 16 xy points  */
  466.                 GadBorder1.XY = DefGadBorderPts;
  467.                 GadBorder1.NextBorder = NULL;
  468.                 result = 5; /* default result is Pos    */
  469.             }
  470.             else error++; /* anything except 0 or 1 is err    */
  471.             break;
  472.  
  473.         default: /* Any other parameters specifiers are wrong    */
  474.             error++;
  475.             break;
  476.  
  477.         }; /* end switch */
  478.  
  479.     }; /* end for */
  480.     
  481.     if (!pfound)    /* if pos text not specified, just say YES    */
  482.     {
  483.         PText[4] = 'Y';
  484.         PText[5] = 'E';
  485.         PText[6] = 'S';
  486.     };            
  487.  
  488.     if (!nfound)    /* if neg text not specified, just say NO    */
  489.     {
  490.         NText[5] = 'N';
  491.         NText[6] = 'O';
  492.     };            
  493.  
  494.     if (error || (!rfound)) /* if an error occurred...        */
  495.     {
  496.         /* print the usage message                */
  497.         puts("USAGE: jask -r [-q] [-p] [-n] [-t] [-d]");
  498.         exit(10);    /* and exit back to AmigaDos        */
  499.     };
  500.     
  501. } /* end Parse_Args() */
  502.  
  503.  
  504. void main(argc, argv)
  505. int argc;
  506. char *argv[];
  507. {
  508.     struct Gadget *Gad; /* pointer to the Gadget message        */
  509.     short GadID;        /* Gadget ID for the message        */
  510.     int time;        /* number of ticks since program start    */
  511.     char i;
  512.     
  513.     time = 0;        /* initialize time to 0            */
  514.     result = 0;        /* default result is 0, if not specified    */
  515.  
  516.     Parse_Args(argc, argv); /* Parse the command line parameters    */
  517.  
  518.     /* Open the intuition library, on error exit...            */
  519.  
  520.     if ((IntuitionBase = OpenLibrary("intuition.library",0)) == NULL)
  521.     {
  522.         puts("Error opening the intuition library");
  523.         exit(10);
  524.     };
  525.     
  526.     /* Open the Screen, on error call done to also close the    */
  527.     /* intuition library                        */
  528.  
  529.     if ((ReqScr = OpenScreen(&ReqScreen)) == NULL)
  530.     {
  531.         puts("Can't open ReqScreen\n");
  532.         result = 10;
  533.         Done();
  534.     };
  535.  
  536.     ReqWindow.Screen = ReqScr;    /* Put the screen address in    */
  537.                     /* window structure, so the    */
  538.                     /* window knows where to go    */
  539.  
  540.     /* Open the window, on error call done to close the screen and    */
  541.     /* the intuition library                    */
  542.  
  543.     if ((ReqWin = OpenWindow(&ReqWindow)) == NULL)
  544.     {
  545.         puts("Can't open ReqWindow\n");
  546.         result = 10;
  547.         Done();
  548.     };
  549.  
  550.     /* Print the requester text into the window at x=160, y=15    */
  551.  
  552.     PrintIText(ReqWin->RPort,&ReqText,160,15);
  553.  
  554.     /* Scroll the screen up to its final position, unless the -q    */
  555.     /* option was specified, which automatically puts it in its    */
  556.     /* final position                        */
  557.  
  558.     for (i=0; ((i<64) && (ReqScreen.TopEdge > 200)) ; i++)
  559.         MoveScreen(ReqScr, 0, -1);
  560.  
  561.     while(TRUE)    /* loop forever, exit on GADGETUP or timeout    */
  562.     {
  563.  
  564.         /* Wait for an intuition message from the window's port    */
  565.         
  566.         WaitPort( ReqWin->UserPort );  
  567.  
  568.         /* Message received, so get a pointer to it        */
  569.  
  570.         msg = (struct IntuiMessage *) GetMsg(ReqWin->UserPort);
  571.  
  572.         /* We could recieve more that one message, so loop    */
  573.         /* until all have been processed            */
  574.  
  575.         while (msg != 0)
  576.         {
  577.             
  578.             /* switch on the type of message received    */
  579.             
  580.             switch (msg->Class)
  581.             {
  582.             case GADGETUP:    /* A Gadget was selected    */
  583.  
  584.                 /* Get the address of the Gadget    */
  585.  
  586.                 Gad = (struct Gadget *)(msg->IAddress);
  587.  
  588.                 /* Determine which gadget was selected    */
  589.  
  590.                 GadID = Gad->GadgetID;
  591.  
  592.                 /* if GadID is TRUE, the pos gadget was    */
  593.                 /* selected, else the neg was selected    */
  594.                 /* set the result appropriately        */
  595.  
  596.                 if (GadID)
  597.                     result = 5;
  598.                 else
  599.                     result = 0;
  600.  
  601.                 /* We're done, close whatever we opened    */
  602.                 /* and return the result to AmigaDos    */
  603.  
  604.                 Done();
  605.                 break;
  606.  
  607.             case INTUITICKS: /* A timer msg was received    */
  608.  
  609.                 /* if the tick count is greater than    */
  610.                 /* timeout, we're done, so close what-    */
  611.                 /* ever we opened and send the default    */
  612.                 /* result to AmigaDos            */
  613.  
  614.                 if (time++ > timeout) Done();
  615.                 break;
  616.             } /* switch (msg->class)... */
  617.  
  618.             ReplyMsg(msg); /* Done with the msg, so send it    */
  619.                        /* back to intuition        */
  620.  
  621.             /* Get the next message, if any            */
  622.  
  623.             msg = (struct IntuiMessage *) 
  624.                 GetMsg(ReqWin->UserPort);
  625.                   
  626.         } /* end while (msg != 0)... */
  627.  
  628.     } /* end while (TRUE)... */
  629.  
  630. } /* end main() */
  631.  
  632. /* End of file - JASK.C                            */
  633. SHAR_EOF
  634. cat << \SHAR_EOF > read.me
  635. Copyright 1988 by I2(EYE) Systems.        READ.ME - Version 1.0
  636.  
  637.  
  638.             JASK Distribution
  639.             -----------------
  640.             
  641. FILES INCLUDED:
  642.  
  643.         jask.c        - source code
  644.         jask        - executable
  645.         jask.doc    - help file for JASK
  646.         test_jask    - sample script file using JASK
  647.         read.me        - this file.
  648.         
  649.     For a quick test of JASK, at the cli prompt type:
  650.     
  651.     execute test_jask
  652.     
  653.     
  654.     Note: if you want to pass spaces in any parameters, remember
  655.     to enclose the parameter in quotes.
  656.     EXAMPLE: "-pThere are spaces in here"
  657.     
  658.     
  659.     USENET | ARPANET: barsh@stsci
  660.     
  661.  
  662. SHAR_EOF
  663. cat << \SHAR_EOF > jask.doc
  664.  
  665.  Copyright 1988 by I2(EYE) Systems.        JASK.DOC - Version 1.0
  666.  
  667.  
  668.         JASK - Intuitive Ask Replacement
  669.         --------------------------------
  670.             
  671.    JASK is a replacement for the ASK command distributed in the Amiga 1.3
  672.    enhancer package. It will allow the user to click on a gadget to specify
  673.    a positive or negative response rather than type it in at the keyboard.
  674.    You can move the "requester" to the bottom of the screen or to the front
  675.    or back of other screens if you don't want to answer it at the moment.
  676.  
  677.                 JASK Parameters
  678.                 ---------------
  679.                 
  680.     -r  This parameter specifies the "requester" text.  This is
  681.         the question you want to ask.
  682.          
  683.         This is the only REQUIRED parameter. (40 character max.)
  684.  
  685.         EXAMPLE: "-rYour MOMMA is ?" = Your MOMMA is ? in the
  686.                                        requester box.
  687.         (put quotes around the string to put spaces in the text)
  688.     
  689.     -p  This specifies the text for the positive (left) gadget.
  690.         When this gadget is selected, WARN (5) will be returned.
  691.         (put quotes around the string to put spaces in the text)
  692.         DEFAULT: YES    (12 character max.)
  693.         EXAMPLE: -pUGLY = UGLY in the left gadget.
  694.  
  695.     -n  This specifies the text for the negative (right) gadget.
  696.         When this gadget is selected, 0 will be returned (success).
  697.         (put quotes around the string to put spaces in the text)
  698.         DEFAULT: NO        (12 character max.)
  699.         EXAMPLE: -nPHAT = PHAT in the right gadget.
  700.  
  701.     -t  This will specify a timeout period in seconds.  When the
  702.         timeout period expires, the default answer will be returned.
  703.         DEFAULT: wait forever
  704.         EXAMPLE: -t10 = wait 10 seconds.
  705.         
  706.     -d  This parameter specifies which gadget is the default (safe)
  707.         answer.  It does two things:
  708.         a) determines if the positive or negative answer is 
  709.            to be default.
  710.         b) makes a more extravagant border for the specified
  711.            gadget.
  712.         n specifies the negative answer, p specifies the positive
  713.         answer.
  714.         DEFAULT: if this is not specified, both gadgets will look
  715.                  the same, but the negative gadget will be returned.
  716.         EXAMPLE: -dp = Fancy gadget rendered on positive and positive
  717.                        is the default answer.
  718.  
  719.     -q  This specifies whether you want the "requester" quick or if
  720.         you want the "requester" to scroll up.
  721.         DEFAULT: the "requester" scrolls up to it final position.
  722.         EXAMPLE: -q = turn off the scrolling effects.
  723.  
  724.  
  725.   This software may be freely distributed provided that this notice
  726.   is retained.  It may be hacked or used as is in any product as long
  727.   as you credit me for it.
  728.  
  729.   If you find this program useful for enhancing your script file
  730.   capabilites or as example source code, please send $5.00 to:
  731.  
  732.             I2(EYE) Systems
  733.             6620 Hunter Road
  734.             Elkridge, MD 21227
  735.             Attn: J. Barshinger
  736.  
  737.     Note: if you send $10.00,  I'll send you the latest enhancements.
  738.           Planned enhancements include a re-entrant version so
  739.           that it can be made resident and a mouse-move capability
  740.           that will automatically move the pointer to the default
  741.           gadget.
  742.  
  743.   USENET or ARPANET: barsh@stsci
  744.  
  745.  
  746. SHAR_EOF
  747. cat << \SHAR_EOF > test_jask
  748. ; Copyright 1988 by I2(EYE) Systems.        TEST_JASK - Version 1.0
  749. ;
  750. failat 6
  751. ; these parameters say:
  752. ; -r = the requester text is YA MOMMA is ?
  753. ; -p = the positive gadget says FAT
  754. ; -n = the negative gadget says UGLY
  755. ; -d = the default is positive and draw a fancy border around the pos gad
  756. ; -t = parameter not specified so never timeout
  757. jask "-rYA MOMMA is ?" -pFAT -nUGLY -dp
  758. if warn
  759. echo "POS Gadget pressed"
  760. else
  761. echo "NEG Gadget pressed"
  762. endif
  763. ; these parameters say:
  764. ; -r =  the requester text is YA MOMMA is ?
  765. ; -p = the positive gadget says FAT
  766. ; -n = the negative gadget says UGLY
  767. ; -d = the default is negative and draw a fancy border around the neg gad
  768. ; -t = timeout after 5 seconds and take the default answer
  769. ; -q = bring up the requester quick, don't scroll it up
  770. jask "-rYA MOMMA is ?" -pFAT -nUGLY -dn -t5 -q
  771. if warn
  772. echo "POS Gadget pressed"
  773. else
  774. echo "NEG Gadget pressed"
  775. endif
  776. ; Only the required parameter is specified here
  777. jask "-rIsn't this a simple case?"
  778. if warn
  779. echo "POS Gadget pressed"
  780. else
  781. echo "NEG Gadget pressed"
  782. endif
  783. SHAR_EOF
  784. cat << \SHAR_EOF > jask.uu
  785.  
  786. begin 644 jask
  787. M```#\P`````````$``````````,```5]```!B0```!H````B```#Z0``!7TD7
  788. M2"0`2?D`````1_D```.T<@`@/````)Q@`B;!4<C__"QX``0I3@/L*4\#]$*L7
  789. M`_`F;@$4<``B/```,`!.KO[.*6L`F`/H2JL`K&<``'`@#Y"O``0&@````(`I2
  790. M0`.X80`!+B!K`*S1R-'((F@`$-/)T\D@`G(`$ADI20/\T(%2@$)G4H`"0/_^3
  791. MG\!5@$)W"``@`E.`U($?L@``(`!3@E'(__8?O``@(`!3@A^Q(``@`%'*__@B'
  792. M3R\)8```>"EK`#H#N'!_4H#1K`.X80``PD'K`%Q.KOZ`0>L`7$ZN_HPI0`/PP
  793. M+P`D0"`J`"1G$BQL!B`@0"(H```I00/H3J[_@B(J`"!G&B0\```#[4ZN_^(IW
  794. M0`/X9PKEB"!`)V@`"`"D(&P#\"\(2&P#M"!H`"0I:``$`_Q.N@5P3KH%V'``G
  795. M8`0@+P`$+P`@+`/@9P0@0$Z03KH-S"QX``0B;`8@3J[^8DZZ!49*K`/P9QHBV
  796. M+`/X9P1.KO_<+'@`!$ZN_WPB;`/P3J[^AB`?+FP#]$YU<&1@M$/Z`!!P`$ZN]
  797. M_=@I0`8@9^Q.=61O<RYL:6)R87)Y`+_L`[AE``K&2JP$"&<*+RP$"$ZZ!*!8<
  798. M3TJL`@1G"B\L`@1.N@3`6$]*K`((9PHO+`((3KH$MEA/2JP"#&<*+RP"#$ZZU
  799. M!*Q83R\L!`!.N@[J6$].=4Y5__2_[`.X90`*;DCG!S`N+P`H)F\`+'``?`$;M
  800. M0/_X&T#_^1M`__H;0/_[(`9(@$C`L(=L``)P$`9(@"(`2,'E@21S&`!P+;`2[
  801. M9P12+?_[$"H``4B`2,`O`$ZZ"CA83W(P!$$`"&L``C2PNQ`(9O).^Q`&````9
  802. M9&```;X```!T8``!C@```&Y@``$0````<&```)(```!R8```%````'%@```"@
  803. M.7P`D@&V8``!]$HM__IF``'L&WP``?_Z0>H``B\(3KH*0%A/*@!P*+H`;P(J;
  804. M`"`%2(!(P'(HDH!*@6H"4H'B@1M\``+__!M!__T@!4B`2,!4@!(M__Q(@4C!/
  805. MLH!L``&>$"W__4B`$BW__$B!0^P`*!.R$````%(M__U2+?_\8,I*+?_Y9@`!B
  806. M=AM\``'_^4'J``(O"$ZZ"<I83RH`<`RZ`&\"*@`@!4B`2,!R#)*`2H%J`E*!V
  807. MXH$;?``"__P;0?_](`5(@$C`5(`2+?_\2(%(P;*`;``!*!`M__U(@!(M__Q(N
  808. M@4/L`%$3LA````!2+?_]4BW__&#*2BW_^&8``0`;?``!__A!Z@`"+PA.N@E4B
  809. M6$\J`'`,N@!O`BH`(`5(@$C`<@R2@$J!:@)2@>*!&WP``O_\&T'__2`%2(!(U
  810. MP%2`$BW__$B!2,&R@&P``+(0+?_]2(`2+?_\2(%#[`!>$[(0````4BW__5(M0
  811. M__Q@RD'J``)(;`0$+PA.N@C\4$\@+`0$<@I.N@[X*4`$!"E\`$``0`'>8&@0;
  812. M*@`"2(!(P"\`3KH(4%A/<FZP@688&7P`$`$W0>P`J"E(`3A"K`$\0JP$`&`Z4
  813. M$"H``DB`2,`O`$ZZ"")83W)PL(%F&AE\`!`!)T'L`*@I2`$H0JP!+'`%*4`$@
  814. M`&`*4BW_^V`$4BW_^U(&8`#]B$HM__EF$AE\`%D`51E\`$4`5AE\`%,`5THM-
  815. M__AF#!E\`$X`8QE\`$\`9$HM__MF!DHM__IF$DAL`A!.N@G"2'@`"DZZ"_I0\
  816. M3TS?#.!.74YUO^P#N&4`!WQ(YP\P+B\`'"9O`"!Z`$*L!``O"R\'80#\ZD*7Z
  817. M2&P".$ZZ`5Y/[P`,*4`"#$J`9A)(;`)*3KH)<$AX``I.N@NH4$](;`&T3KH!O
  818. M(%A/*4`""$J`9A1(;`)N3KH)3'`**4`$`&$`_$I83REL`@@!\DAL`=1.N@$`8
  819. M6$\I0`($2H!F%$AL`H1.N@D@<`HI0`0`80#\'EA/2'@`#TAX`*!(;`!L(&P"K
  820. M!"\H`#).N@#<3^\`$'@`<$"X`&P@,"P!M@Q``,AO%DAX__]"IR\L`@A.N@"^I
  821. M3^\`#%($8-H@;`($+R@`5DZZ`(P@;`($+J@`5DZZ`(Q83RE`!`A*K`0(9]P@`
  822. M;`0(("@`%`R``$```&<J#(````!`9C`@;`0()&@`'#PJ`"9*1F<(<`4I0`0``
  823. M8`1"K`0`80#[?&`.(`52A;"L!`1O!&$`^VPO+`0(3KH`&"!L`@0NJ`!63KH`$
  824. M)%A/*4`$"&"6``!.^0```!1.^0```$1.^0```"A.^0```%A.^0````!.^0``X
  825. M`%!.^0```&Q.^0```"A.^0```!1.^0````!.^0```#QP84YU3G5(YP<P+B\`Q
  826. M&"9O`!PL+P`@+P=.N@YT6$\D0"`*9@1P_V`V""H``P`#9Q!(>``"0J<O!TZZ`
  827. M"'!/[P`,+P8O"R\J``1.N@I,3^\`#"H`2JP#S&<$</]@`B`%3-\,X$YU````@
  828. M``````!P84Y5__!(YR$R)F\`+`RL````(`6&;```AA`3<B"P`6<,<@FP`6<&M
  829. M<@JP`68$4HM@Z$H39V@@+`6&Y8!2K`6&0>P%CM'`)$AP(K`39B92BR2+2A-G;
  830. M"G`BL!-G!%*+8/)*$V8,2'@``4ZZ!*A83V">0AM@FB2+2A-G&!`3<B"P`6<0A
  831. M<@FP`6<*<@JP`6<$4HM@Y$H39@)@!D(;8`#_<DJL!89F!B!L`_!@!$'L!8XIH
  832. M2`6*2JP%AF9\0?H!)$/L!4PBV"+8(M@BV#*0(FP#\"!I`"1(>``H+R@`!$ALI
  833. M!4Q.N@2^3^\`#$'L!4PB""0\```#[BQL!B!.KO_B*4`$$"E`!!AR!"E!!!0I<
  834. M0`0@*4$$'.6`D\DL>``$*T#_\$ZN_MH@;?_P(D`C:``(`*1^`"M`__1@*BQL8
  835. M!B!.KO_**4`$$$ZN_\0I0`080?H`IB(()#P```/M3J[_XBE`!"!^!"`'`$"`:
  836. M`8&L!`P@!P!`@`*!K`04`*P``(`#!!Q*K`,<9P1P`&`&(#P``(``+@!"K`+0;
  837. M(`<`0``!*4`"S'`!*4`"\B`'`$```BE``NYP`BE``Q0@!P!``(`I0`,00?H+*
  838. M.BE(`^0O+`6*+RP%ADZZ_!Q"ETZZ"`1,[4R$_]Q.74YU8V]N.C$P+S$P+S,R`
  839. M,"\X,"\`*@`````````````````````````````````````````````````O/
  840. M"R9O``A*JP`49PP(*P`#`!MF!'``8#8O+`.P3KH'CEA/)T``!"=``!!*@&8*3
  841. M<`PI0`8<</]@%B=L`[``%'#SP:L`&'``)T``#"=```@F7TYU````````````'
  842. M``````!.5?_L2.<O$"XO`#0F;P`X*`=P,<"K`!AG!G#_8``"<`@K``<`&E;`%
  843. M1`!(@$C`+`!*JP`49@``A`@K``(`&V9Z<``G0``,<O^^@6<``D(O"TZZ_TY8(
  844. M3TJ`9PP(ZP`%`!MP_V```BH(ZP`!`!M*!F<.("L`%"(`1($G00`,8`@@*P`4O
  845. M)T``#%.K``QM%B!K``1#Z``!)TD`!"`'$(!R`!(`8!(@!W(`$@`O"R\!80#_1
  846. M4E!/(@`@`6```=8(*P`"`!MG6'#_OH!F!G``8``!PB`'&T#__TH&9R)R"KZ!Z
  847. M9AQR`B\!2'H!LB\K`!PK0?_P3KK\-$_O``PJ`&`:<@$O`4AM__\O*P`<*T'_)
  848. M\$ZZ_!A/[P`,*@!^_V```.`(ZP`!`!M*!F=2</^^@&=,5*L`#'(*OH%F)B!K2
  849. M``1#Z``!)TD`!!"\``TB*P`,2H%K"B\++P!A`/ZN4$]2JP`,(&L`!$/H``$G6
  850. M20`$(`<0@"(K``Q*@6L``1Q^_R`K``20JP`0*T#_\&=R""L`!@`:9U)(>``"(
  851. M0J<O*P`<3KH$,$_O``PK0/_L2@9G.%.M_^QM,D*G+RW_["\K`!Q.N@002'@`V
  852. M`4AM__TO*P`<3KH#$$_O`!A*K`/,9@H0+?_]<AJP`6?(+RW_\"\K`!`O*P`<>
  853. M3KK[.$_O``PJ`&`">@!P_[J`9@@(ZP`%`!M@#+JM__!G!@CK``0`&TH&9PXB=
  854. M*P`4)`%$@B="``Q@&`@K``(`&V<(<@`G00`,8`@B*P`4)T$`#"!K`!`G2``$'
  855. MOH!G+E.K``QM%B!K``1#Z``!)TD`!"`'$(!R`!(`8!(@!W(`$@`O"R\!80#]O
  856. MD%!/(@!P,,"K`!AG!'#_8`QP_[B`9@1P`&`"(`1,WPCT3EU.=0T*`````$CG<
  857. M!P`N+P`0+"P"G$I&:S`@!DC`YX!![`0,*C`(`$H%9QH(!0`"9A0@!DC`YX!!X
  858. M[`0,+S`(!$ZZ!?183U-&8,PO!TZZ]-I83TS?`.!.=0``````````<&$N;`/TW
  859. M3KH%[DAY````%$ZZ!%P``````````'!A("\`!`P``$%M"@P``%IN!`8``"!.L
  860. M=0``3E7_^$CG`S`F;P`@)&\`)"XO`"@@2DH89OQ3B)'*+`@@2TH89OQ3B)'+@
  861. M(`@B2]/`*TG_^+R'8P(L!R`&($I@`A+84X!D^B!M__A",&@`(`M,WPS`3EU.T
  862. M=2!O``0@"$H89OQ32)'`(`A.=0``(&\`!")(<@!P`"\"#!``*V<&#!``+68"`
  863. M4D@0&`0``#!M$@P```EN#"0!Y8'2@M*!TH!@Y@P1`"UF`D2!)!\@"%.`(&\`2
  864. M"""!D(E.=4Y5_^A(YP$R+B\`-$J';@9P_V```-)P"+Z`9`(N`"`'5H`N``)'F
  865. M__PD;0`((&T`"-''WZP"L$/L`JPF42M(__`K2?_T(`MG``"0($L@*P`$T<`KS
  866. M2/_L(FW_\+?)8Q`DBR5'``0L;?_T+(IP`&!XM\EF&BQ3)(X@*P`$(@#2AR5!N
  867. M``0L;?_T+(IP`&!:M<AD")^L`K!P_V!.M<AF+$J39PX@4[/(8PB?K`*P</]@Y
  868. M.-^K``1*DV<.L]-F"B`I``31JP`$)I%P`&`>*TO_]"MM_^S_Z"938`#_;B!MF
  869. M__0@BD*2)4<`!'``3-],@$Y=3G4``````````'!A2.<',"XO`!@F;P`<+"\`N
  870. M("\'3KH&P%A/)$`@"F8$</]@'B\&+PLO*@`$3KH#>$_O``PJ`$JL`\QG!'#_2
  871. M8`(@!4S?#.!.=0``2.<!$"9O``Q^`!X;2H=G,E.L`N)M%B!L`MI#Z``!*4D"1
  872. MVB`'$(!R`!(`8-P@!W(`$@!(;`+6+P%.NOJF4$\B`&#&4ZP"XFT6(&P"VD/H`
  873. M``$I20+:<`H0@'(`$@!@$$AL`M9(>``*3KKZ>%!/(@`@`4S?"(!.=0``2.<`D
  874. M,B9L!A`@"V<4)%,B2R`K``@L>``$3J[_+B9*8.B1R"E(!A0I2`803-],`$YUE
  875. M2.</$"XO`!@L+P`<*B\`("\'3KH%T%A/)D`@"V8$</]@'B\%+P8O*P`$3KH"F
  876. M#$_O``PH`$JL`\QG!'#_8`(@!$S?"/!.=0``````````<&%(YP$R+B\`%'`,I
  877. MWH`@!W(`+'@`!$ZN_SHF0"`+9@1P`&`Z)T<`"$7L!A`@:@`$)T@`!)'()HA*H
  878. MDF8")(M*J@`$9P8B:@`$(HLE2P`$2JP"H&8$*4L"H$'K``P@"$S?3(!.=0``Q
  879. M````````````````2.<#,"XO`!1*AVX&<`!@``"D<`B^@&0"+@`@!U:`+@`"#
  880. M1__\1>P"K"92(`MG0"`K``2PAVTRL(=F#"!3)(B?K`*P(`M@;B`K``20AW((N
  881. ML(%E%B!+T<<DB"1()),E0``$GZP"L"`+8$PD2R938+P@!R(L`R#0@5.`3KH"%
  882. MNB(L`R!.N@*2+`!0AB`&5H`L``)&__PO!DZZ_OI83R9`(`MG$B\&+PM.NORR_
  883. M+H=A`/]44$]@`G``3-\,P$YU``````````!P82\'+B\`""\'3KK_,EA/+A].Q
  884. M=0``2.<#$"XO`!!'[`*T(`MG-`@K``(`&V8H""L``0`;9R`@*P`$D*L`$"P`-
  885. M2H9G$B\&+RL`$"\K`!Q.NO6*3^\`#"938,@O!TZZ^O183TS?",!.=0``2.<W_
  886. M$"XO`!PF;P`@+"\`)$JL`^1G!$ZZ!"!"K`/,(@<D"R8&+&P&($ZN_]`J`'#_4
  887. MNH!F#DZN_WPI0`/,<`4I0`8<(`5,WPCL3G4``$CG/P`N+P`<+"\`("HO`"1*-
  888. MK`/D9P1.N@/40JP#S"`%4X`B!R0&)@`L;`8@3J[_OB@`</^X@&8.3J[_?"E`E
  889. M`\QP%BE`!AP@!0R``````F<6#(`````!9PA*@&88(`9@%"`$T(9@#B('=`!VI
  890. M`"QL!B!.KO^^3-\`_$YU``!(YS<0+B\`'"9O`"`L+P`D2JP#Y&<$3KH#6$*L=
  891. M`\PB!R0+)@8L;`8@3J[_UBH`</^Z@&8.3J[_?"E``\QP!2E`!AP@!4S?".Q.J
  892. M=0``+P<N+P`(2JP#Y&<$3KH#%B('+&P&($ZN_]QP`"X?3G5.5?^P+PY*K`(,*
  893. M9A)#^@"(<``L>``$3J[]V"E``@QP`"!L`_P0*/__0^W_L&`"$MA3@&3Z<``@Z
  894. M;`/\$"C__T(U"+!![?^P*4@#,$AX`"A(>`#Z<``O`"\`2&P#3'(`+P%(;`,X5
  895. M+P%.N@+L2'@`%$ZZ^40L;?^L3EU.=2HJ(%-T86-K($]V97)F;&]W("HJ``!%(
  896. M6$E4``!I;G1U:71I;VXN;&EB<F%R>0````````````````!(YS``)``F`4A"O
  897. M2$/$P<;`P,'40TA"0D+0@DS?``Q.=4J`:@``'D2`2H%J```,1(%A```@1(%.X
  898. M=6$``!A$@$2!3G5*@6H```Q$@6$```9$@$YU+P)(030!9@``(DA`2$%(0C0`T
  899. M9P``!H3!,`)(0#0`A,$P`DA",@(D'TYU+P-V$`Q!`(!D```&X9E10PQ!"`!D1
  900. M```&Z9E90PQ!(`!D```&Y9E50TI!:P``!N.94T,T`.:H2$)"0N:J2$.`P38`!
  901. M,`(T`TA!Q,&0@F0```A30]"!9/YR`#(#2$/GN$A`P4$F'R0?3G5.5?^>2.<S&
  902. M,GX`(&P#_!XH__]P3[Z`;P(N`"`'0^W_KV`"$MA3@&3Z0C5XKY/)+'@`!$ZN[
  903. M_MHF0$JK`*QG3"`K`*SE@"1`+"H`.$J&9@0L*P"@2H9G-"(&0?H`LB0(=@LLJ
  904. M;`8@3J[_T"!'4H<@"!N\``H(KR(&0>W_KR0()@<L;`8@3J[_T'#_8$Y*K`(,D
  905. M9A)#^@"&<``L>``$3J[]V"E``@Q![?^O*4@#@$AX`#Q(>`#Z<``O`"\`2&P#F
  906. MG$AL`XA(;`-T0J=.N@#T3^\`(%.`9P1P_V`"<`!,WTS,3EU.=2HJ(%5S97(@L
  907. M06)O<G0@4F5Q=65S=&5D("HJ``!#3TY424Y510``04)/4E0`*BHJ($)R96%K>
  908. M.B``:6YT=6ET:6]N+FQI8G)A<GD````O!RXO``AP`"E``\Q*AVLBOJP"G&P<1
  909. M(`?G@$'L!`Q*L`@`9PX@!^>`0>P$#-'`(`A@"'`)*4`&''``+A].=0``2.<!B
  910. M`G``(CP``#``+'@`!$ZN_LXN``*'```P`$J'9@1P`&`@2JP#Y&<8(&P#Y$Z0O
  911. M2H!F!'``8`Q(>``43KKV<EA/(`=,WT"`3G5AM$YU``!(YS`R+&P"#"!O`!@BH
  912. M;P`<)&\`("9O`"0@+P`H(B\`+"0O`#`F+P`T3J[^I$S?3`Q.=0`````#[```*
  913. M``(````!````#`````8````%`````@``!GH```9N```&@```!IX```9B````B
  914. M!@````,```:,```&A@``!G0```9H```&F```!I(````````#\@```^H```#M4
  915. M=&]P87HN9F]N=``````````(!`%T;W!A>BYF;VYT```````4``@``2`@("`@P
  916. M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("``("`@("`@("`@`
  917. M("`@`"`@("`@("`@("`@(````P(!```````````,````*``````!`@````(`?
  918. M!0```"````!1``````$"`````@`%````(````%X`````____^O_Y____^0`4W
  919. M__\`&0!D`!D`:@`4`&K__P!D__K____Z__\`&?__`!0`9``4`&0`&0!D__H`)
  920. M9/____________\`9/__`&0`%/__`!3_______S__0!G__T`9P`6__P`%O_\E
  921. M__T``````@,`!0```/P```````````(#``4```#H```!$``````"`P`%````/
  922. MZ````1```````?0`"@!D`!0````!``$```$P`````````)0`````````````W
  923. M`````````4``*``*`&0`%`````$``0```2``````````@`````````````$`/
  924. M````2E)"24DG<R!!<VL@4F5Q=65S=&5R(%8Q+C```````-("@``U``("`X``^
  925. M``\````@```!F```````````````"@*``"O__P```$```!`````!;```````Z
  926. M```````````````````````````/````````````````55-!1T4Z(&IA<VL@G
  927. M+7(@6RUQ72!;+7!=(%LM;ET@6RUT72!;+61=`&EN='5I=&EO;BYL:6)R87)YE
  928. M`$5R<F]R(&]P96YI;F<@=&AE(&EN='5I=&EO;B!L:6)R87)Y`$-A;B=T(&]P_
  929. M96X@4F5Q4V-R965N"@!#86XG="!O<&5N(%)E<5=I;F1O=PH````````H````V
  930. M``````````````````````````+6````````````````````````````````8
  931. M```````````"^```````````````````````````````````````````````Z
  932. M````````````````````````````````````````````@`````0`__\````.0
  933. M``X```````````````#__P````0`!````````!+F```#)/__````!``$````Y
  934. M````$OP`````__\````.``X````````4Y`````#__P````0`!```````````F
  935. M```#8/__````!``$````````%0``````__\````$``0````````5"@``````C
  936. M``(````#[`````4````````#J````Y0```-L```#6````T0````9`````0``C
  937. M`X0```-(```"U@```K0```'F```!R````<0```&&```!?@```6P```%:```!D
  938. M4@```3P```$X```!+````2@```$8````H````)P```",````B````'@```!TS
  939. M````(`````P````````#\@```^D````:+PXL>0```^P@;P`(3J[^C"Q?3G4O2
  940. M#BQY```#[")O``A.KOZ&+%].=2\.+'D```/L(&\`"$ZN_H`L7TYU+PXL>0``;
  941. M`^PB;P`(3J[^8BQ?3G4O#BQY```#[")O``@@+P`,3J[]V"Q?3G4```/L````%
  942. M!0````$```!4````0````"P````8````!`````````/R```#Z0```"(O#BQY'
  943. M```"#"!O``A.KO^^+%].=2\.+'D```(,(&\`"$ZN_[@L7TYU+PXL>0```@P@$
  944. M;P`(3.\``P`,3J[_7BQ?3G4``"\.+'D```(,(&\`"$ZN_SHL7TYU+PXL>0``4
  945. M`@P@;P`(3J[_-"Q?3G4O#BQY```"#$SO`P``"$SO``,`$$ZN_R@L7TYU```#:
  946. I[`````8````!````<````%P```!(````+````!@````$`````````_)UY
  947. ``
  948. end
  949. size 7196
  950. SHAR_EOF
  951. #    End of shell archive
  952. exit 0
  953. -- 
  954. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  955. Have five nice days.
  956.